const OpenAI = require('openai')
const mData = require('./data')
const jl = require('./jli')


// 配置 DeepSeek API
const deepseek = new OpenAI({
  apiKey: 'sk-2f1be7c199d54857a9f26f2c73832a76', // 替换为你的 DeepSeek API 密钥
  baseURL: 'https://api.deepseek.com', // DeepSeek API 基础地址
})

// 定义可供 AI 调用的函数
const availableFunctions = {
  getJl: () => {
    return jl
  },
  get_company_data: (quarter) => {
    console.log('quarter',quarter)
    return mData
  },
  get_current_weather: async (location) => {
    // 这里应该是实际调用天气 API 的代码
    // 为了示例，我们返回模拟数据
    return {
      location,
      temperature: '22',
      unit: 'celsius',
      forecast: ['sunny', 'windy'],
    }
  },
  get_stock_price: async (symbol) => {
    // 模拟股票价格查询
    return {
      symbol,
      price: 768 * 1000,
      currency: 'USD',
      last_updated: new Date().toISOString(),
    }
  },
}

/**
 * 处理函数调用
 * @param {Object} functionCall - 函数调用对象
 * @returns {Promise<Object>} - 函数执行结果
 */
async function handleFunctionCall(functionCall) {
  const { name, arguments: args } = functionCall
  console.log(`调用函数: ${name}`, args)

  if (!availableFunctions[name]) {
    throw new Error(`函数 ${name} 不存在`)
  }

  // 解析参数 (API 返回的是 JSON 字符串)
  const parsedArgs = JSON.parse(args)
  return await availableFunctions[name](parsedArgs)
}

/**
 * 使用 Function Calling 调用 DeepSeek Chat API
 * @param {string} prompt - 用户输入的提示
 * @param {Object} [options] - 可选参数
 * @returns {Promise<string>} - AI 生成的回复内容
 */
async function callDeepSeekWithFunctions(prompt, options = {}) {
  const {
    model = 'deepseek-chat',
    temperature = 0.7,
    max_tokens = 2048,
  } = options

  // 定义可供调用的函数
  const tools = [

    {
      type: 'function',
      function: {
        name: 'get_company_data',
        description: '公司的季度财务数据',
        parameters: {
          type: 'object',
          properties: {
            quarter: {
              type: 'string',
              description: "季度,如 '第一季度'",
            },
          },
          required: ['quarter'],
        },
      },
    },
    
    {
      type: 'function',
      function: {
        name: 'get_current_weather',
        description: '获取指定地点的当前天气',
        parameters: {
          type: 'object',
          properties: {
            location: {
              type: 'string',
              description: "城市名称，如 '北京' 或 'New York'",
            },
          },
          required: ['location'],
        },
      },
    },
    {
      type: 'function',
      function: {
        name: 'get_stock_price',
        description: '获取股票的当前价格',
        parameters: {
          type: 'object',
          properties: {
            symbol: {
              type: 'string',
              description: "股票代码，如 'AAPL' 或 'MSFT'",
            },
          },
          required: ['symbol'],
        },
      },
    },
  ]

  try {
    // 第一步：发送用户消息并获取 AI 响应
    const response = await deepseek.chat.completions.create({
      model,
      messages: [{ role: 'user', content: prompt }],
      tools,
      tool_choice: 'auto', // 让 AI 决定是否调用函数
      temperature,
      max_tokens,
    })

    const { message } = response.choices[0]

    // 第二步：检查是否需要调用函数
    const toolCalls = message.tool_calls
    if (toolCalls) {
      // 准备存储所有函数调用的结果
      const messages = [{ role: 'user', content: prompt }]
      messages.push(message) // 添加 AI 的初始响应

      // 处理每个函数调用
      for (const toolCall of toolCalls) {
        const functionName = toolCall.function.name
        const functionArgs = toolCall.function.arguments
        const functionResponse = await handleFunctionCall({
          name: functionName,
          arguments: functionArgs,
        })

        // 将函数调用结果添加到消息历史
        messages.push({
          tool_call_id: toolCall.id,
          role: 'tool',
          name: functionName,
          content: JSON.stringify(functionResponse),
        })
      }

      // 第三步：将函数结果发送回 AI 获取最终响应
      const secondResponse = await deepseek.chat.completions.create({
        model,
        messages,
        temperature,
        max_tokens,
      })

      return secondResponse.choices[0].message.content
    }

    // 如果没有函数调用，直接返回响应
    return message.content
  } catch (error) {
    console.error('调用 DeepSeek API 时出错:')
    if (error.response) {
      console.error(`状态码: ${error.response.status}`)
      console.error(
        `错误信息: ${error.response.data?.error?.message || '未知错误'}`
      )
    } else {
      console.error(error.message)
    }
    throw error
  }
}

// 使用示例
;(async () => {
  try {
    // const comDataPrompt = '分析我们公司第一季度的财务状态'
    // console.log(`用户提问: ${comDataPrompt}`)
    // const comDataResponse = await callDeepSeekWithFunctions(comDataPrompt)
    // console.log('DeepSeek 回复:', comDataResponse)


    const jlPrompt = '我是一名人事,公司需要组织一个项目组，开发工厂车间管理系统，现在需要对收到的简历进行筛选，在综合人员能力、项目经验、专业对口、工作经历、薪资性价比等方面进行筛选，最终确定5个人加入项目组，需要提供每个人的姓名、手机号、邮箱、工作经历、项目经历、技术栈等信息'
    console.log(`用户提问: ${jlPrompt}`)
    const jlResponse = await callDeepSeekWithFunctions(jlPrompt)
    console.log('DeepSeek 回复:', jlResponse)


    // // 示例2：会触发天气函数调用
    // const weatherPrompt = '北京现在的天气怎么样？'
    // console.log(`用户提问: ${weatherPrompt}`)
    // const weatherResponse = await callDeepSeekWithFunctions(weatherPrompt)
    // console.log('DeepSeek 回复:', weatherResponse)

    // // 示例3：会触发股票函数调用
    // const stockPrompt = '苹果公司(AAPL)的股票现在什么价格？'
    // console.log(`\n用户提问: ${stockPrompt}`)
    // const stockResponse = await callDeepSeekWithFunctions(stockPrompt)
    // console.log('DeepSeek 回复:', stockResponse)
  } catch (error) {
    console.error('处理过程中出错:', error.message)
  }
})()
